﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SalaDeEnsayo.ApplicationService.Model.Entity;

namespace SalaDeEnsayo.ApplicationService
{
    public class GrupoService : BaseService
    {
        #region [ Metodos Publicos ]

        public List<Grupo> GetAll()
        {
            List<Grupo> listaGrupo = new List<Grupo>();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("GruposGetAll"))
            {
                while (dr.Read())
                {
                    listaGrupo.Add(GetEntity(dr));
                }
            }
            return listaGrupo;
        }

        //public List<GrupoDTO> Listar()
        //{
        //    List<GrupoDTO> lista = new List<GrupoDTO>();
        //    using (var dr = this.SalaDeEnsayoDB.ExecuteReader("GruposListar"))
        //    {
        //        while (dr.Read())
        //        {
        //            lista.Add(GetEntityDTO(dr));
        //        }
        //    }
        //    return lista;
        //}

        public List<GrupoDTO> Listar(string filtro)
        {
            List<GrupoDTO> lista = new List<GrupoDTO>();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("grupoFiltrado", filtro))
            {
                while (dr.Read())
                {
                    lista.Add(GetEntityDTO(dr));
                }
            }
            return lista;
        }

        public Grupo ObtenerPorId(long id)
        {
            Grupo grupo = new Grupo();
            using (var dr = this.SalaDeEnsayoDB.ExecuteReader("GruposObtenerPorId", id))
            {
                if (dr.Read())
                {
                    grupo = GetEntity(dr);
                    return grupo;
                }
            }
            return grupo;
        }

        public int AgregarGrupo(Grupo grupo)
        {
            Object[] parms = new Object[4];
            parms[0] = grupo.Nombre_grupo;
            parms[1] = grupo.Integrantes;
            parms[2] = grupo.Estilo;
            parms[3] = grupo.CantidadIntegrantes;
            try
            {
                int res = this.SalaDeEnsayoDB.ExecuteNonQuery("GruposAgregar", parms);
                return res;
            }
            catch
            {
                return 0;
            }
        }

        public int EliminarGrupo(long id)
        {
            try
            {
                int res = this.SalaDeEnsayoDB.ExecuteNonQuery("GruposEliminar", id);
                return res;
            }
            catch
            {
                return 0;
            }
        }

        public int ModificarGrupo(Grupo newGroup)
        {
            Object[] parms = new Object[5];
            try
            {
                parms[0] = newGroup.Id;
                parms[1] = newGroup.Nombre_grupo;
                parms[2] = newGroup.Integrantes;
                parms[3] = newGroup.Estilo;
                parms[4] = newGroup.CantidadIntegrantes;
                int res = this.SalaDeEnsayoDB.ExecuteNonQuery("GruposModificar", parms);
                return res;
            }
            catch
            {
                return 0;
            }
        }

        public Boolean TieneDependencias(long id_grupo)
        {
            int res = (int)this.SalaDeEnsayoDB.ExecuteScalar("GruposPuedeBorrar", id_grupo);

            if (res > 0)
            {
                return true;
            }
            else 
            {
                return false;
            }

        }

        public Boolean PuedeInsetar(string nombre)
        {

            if ((int)this.SalaDeEnsayoDB.ExecuteScalar("GruposPuedeInsertar", nombre) == 0)
            {
                return false;
            }
            else
            {
                return true;
            }

        }

        #endregion

        #region [ Metodos Privados ]

        private Grupo GetEntity(System.Data.IDataReader dr)
        {
            return new Grupo(dr["id_grupo"] is System.DBNull ? 0 : (long)dr["id_grupo"],
                             dr["nombre_grupo"] is System.DBNull ? string.Empty : (string)dr["nombre_grupo"],
                             dr["integrantes"] is System.DBNull ? string.Empty : (string)dr["integrantes"],
                             dr["id_estilo"] is System.DBNull ? 0 : (int)dr["id_estilo"],
                             dr["cant_integrantes"] is System.DBNull ? 0 : (int)dr["cant_integrantes"]);
        }

        private GrupoDTO GetEntityDTO(System.Data.IDataReader dr)
        {
            return new GrupoDTO(dr["id_grupo"] is System.DBNull ? 0 : (long)dr["id_grupo"],
                             dr["nombre_grupo"] is System.DBNull ? string.Empty : (string)dr["nombre_grupo"],
                             dr["estilo"] is System.DBNull ? string.Empty : (string)dr["estilo"]);
        }

        #endregion
    }

    public class GrupoDTO
    {
        public GrupoDTO(long id_grupo, string nombre, string estilo)
        {
            this.Id = id_grupo;
            this.Nombre_grupo = nombre;
            this.Estilo = estilo;
        }
        public long Id { get; set; }
        public string Nombre_grupo { get; set; }
        public string Estilo { get; set; }
    }
}
